package StructuralPattern.Composite.SafeMode;

/**
 * @Classname : CompositeClient
 * @Description : 测试安全组合模式
 * @Author : chentianyu
 * @Date 2023/2/19 15:48
 */


public class CompositeClient {
    public static void main(String[] args) {
        // 建立树状结构（项目中一般从数据库中循环查询建立）
        Composite president = new Composite("总经理");
        Composite aDept = new Composite("A部门经理");
        Composite bDept = new Composite("B部门经理");
        Leaf aStaff = new Leaf("a员工");
        Leaf bStaff = new Leaf("b员工");
        Leaf cStaff = new Leaf("c员工");
        Leaf dStaff = new Leaf("d员工");
        Leaf eStaff = new Leaf("e员工");
        //【注意】安全组合模式，使用实现类来设置节点父子关系，违反了依赖倒置原则！
        president.addChild(aDept);
        president.addChild(bDept);
        aDept.addChild(aStaff);
        aDept.addChild(bStaff);
        aDept.addChild(cStaff);
        bDept.addChild(dStaff);
        bDept.addChild(eStaff);
        // 查询节点信息
        president.getInfo();
        aDept.getInfo();
        bDept.getInfo();
        aStaff.getInfo();
        eStaff.getInfo();
        //【注意】叶子节点不支持增加子节点，且 无增加子节点方法，属于安全组合模式
        // aStaff.addChild(bStaff);
    }
}

/** 20230219
 * —————————打印节点信息————————
 * 1、本节点: 总经理
 * 2、父节点：无父节点，为根节点
 * 3、子节点：
 *    A部门经理
 *    B部门经理
 * —————————打印节点信息————————
 * 1、本节点: A部门经理
 * 2、父节点：总经理
 * 3、子节点：
 *    a员工
 *    b员工
 *    c员工
 * —————————打印节点信息————————
 * 1、本节点: B部门经理
 * 2、父节点：总经理
 * 3、子节点：
 *    d员工
 *    e员工
 * —————————打印节点信息————————
 * 1、本节点: a员工
 * 2、父节点：A部门经理
 * —————————打印节点信息————————
 * 1、本节点: e员工
 * 2、父节点：B部门经理
 */
